package com.spring.demo.controller;

import com.spring.demo.model.UserInfo;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/req")
public class RequestController {

    @RequestMapping("/req1")
    public String req1(String keyword){
        return "接收参数："+keyword;
    }

    @RequestMapping("/req2")
    public String req2(String userName, String password){
        return "接收参数：" + "用户名：" + userName + "，密码：" + password;
    }

    @RequestMapping("/req3")
    public String req3(UserInfo userInfo){
        return "接收信息：" + "userInfo = " + userInfo;
    }

    // 从前端接收参数q，将其赋值给后端参数keyword
    @RequestMapping("/req4")
    public String req4(@RequestParam("q") String keyword){
    // 表示q不是被传参数
    // public String req4(@RequestParam(value = "q", required = false) String keyword){
        return "接收参数："+keyword;
    }

    // 传集合
    @RequestMapping("/req5")
    public String req5(@RequestParam List<Integer> list){
        return "接收参数："+ list;
    }

    // 传递json，使用@RequestBody注解
    @RequestMapping("/req6")
    public String req6(@RequestBody UserInfo userInfo){
        return userInfo.toString();
    }

    // 获取URL中的参数，符合@RequestMapping中参数格式的参数传给articleId，参数位置不能交换
    // 需要使用@PathVariable来绑定参数
    @RequestMapping("/article/{articleId}/{text}")
    public String req7(@PathVariable Integer articleId, @PathVariable("text") String articleText){
        return "文章ID:" + articleId + "文章内容：" + articleText;
    }

    // 传文件
    @RequestMapping("/req8")
    // 使用RequestPart对前端参数名进行重命名
    public String req8(@RequestPart("file") MultipartFile file) throws IOException {
        // 防止文件为空
        if(file.isEmpty()){
            return "文件为空";
        }
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);
        // 文件上传
        file.transferTo(new File("D:\\" + fileName));
        return "文件上传成功";
    }

    // 传统的获取Cookie方法
    // HTTP请求和响应中的数据都可以通过这两个实例拿到
    @RequestMapping("/req9")
    public String req9(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(Cookie cookie : cookies){
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
        return "获取Cookie成功";
    }

    // 使用注解获取Cookie中的值
    @RequestMapping("/req10")
    public String req10(@CookieValue("name") String name){
        return "从Cookie中获取name的值："+ name;
    }

    // 存储session（默认存储在内存上）
    // 需要先设置一个session，后续才能getSession
    @RequestMapping("/setSession")
    public String getSession(HttpServletRequest request){
        // 从cookie中获取SessionId，根据sessionId获取session对象
        // 此处getSession方法默认参数为true，如果是false，则可能session为NaN
        HttpSession session = request.getSession();
        session.setAttribute("userName", "huo_zhe");
        session.setAttribute("userAge", 18);
        return "设置session成功";
    }

    @RequestMapping("/getSession1")
    public String setSession1(HttpServletRequest request){
        // 从cookie中获取sessionId，根据sessionId获取session对象
        // 如果不存在session，则返回null
        // 不同客户端会携带不同的session
        HttpSession session = request.getSession(false);
        if(session == null){
            return "用户未登录";
        }else {
            // 从session中获取用户登录信息
            String userName  = session.getAttribute("userName").toString();
            return "登录用户为：" +userName;
        }
    }

    @RequestMapping("/getSession2")
    public String setSession2(HttpSession session){
        // 相当于HttpSession session = request.getSession(true);
        if(session == null){
            return "用户未登录";
        }else {
            // 直接从session中获取用户登录信息
            String userName  = session.getAttribute("userName").toString();
            return "登录用户为：" +userName;
        }
    }

    @RequestMapping("/getSession3")
    public String setSession3(@SessionAttribute("userName") String userName){
        // 直接获取session中的用户信息
            return "登录用户为：" +userName;
    }

    @RequestMapping("/getHeader1")
    public String getHeader1(HttpServletRequest request){
        String userAgent = request.getHeader("user-agent");
        return "从Header中获取User-Agent:" +  userAgent;
    }

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return "从Header中获取User-Agent:" +  userAgent;
    }
}
